package com.liangwei.Lock;


/**
 * 多线程售卖票的问题
 */
public class SaleTicketDemo01 {
    //基本的卖票的例子
    public static void main(String[] args) {
        /** * 真正的多线程开发，公司中的开发，降低耦合性 *
         * 线程就是一个单独的资源类，没有任何附属的操作！
         * * 1、 属性、方法 */
        // 并发：多线程操作同一个资源类, 把资源类丢入线程
        Ticket ticket = new Ticket();
        // @FunctionalInterface 函数式接口，jdk1.8  lambda表达式 (参数)->{ 代码 }
        new Thread(() -> {
            for (int i = 0; i < 50; i++) {
                ticket.sale();
            }
        },"售票口A").start();
        new Thread(() -> {
            for (int i = 0; i < 50; i++) {
                ticket.sale();
            }
        }, "售票口B").start();
        new Thread(()->{
            for (int i = 0; i < 50; i++) {
                ticket.sale();
            }
        },"售票口C").start();
    }

    //支援类 OOP思想
    //不加锁的状态下，出现问题，明明票已经卖完了，可还显示有票
    //解决方法1，加上锁synchronized
    //static class Ticket {
    //    //定义属性
    //    private int number = 50;
    //    //定义方法
    //    public void sale() {
    //        //卖票的方法
    //        if (number > 0) {
    //            System.out.println(Thread.currentThread().getName()+"卖出了"+(number--)+"票,剩余："+number);
    //        }
    //    }
    //}
    static class  Ticket {
        //定义属性
        private int number = 50;
        //定义方法
        public synchronized void sale() {
            //卖票的方法
            if (number > 0) {
                System.out.println(Thread.currentThread().getName()+"卖出了"+(number--)+"票,剩余："+number);
            }
        }
    }
}
